﻿﻿
using System;
using System.IO;
using System.Collections.Generic;
using ReadTxt;
using System.Reflection;
using _Car2dEnv;


public class MsgHandle
{
    public string name = "MsgHandleName";

    private int _xx = 5;
    public int xx
    {
        get { return _xx; }
        set { _xx = value; }
    }
    public int yy { get; set; }

    public Car2dEnv env;

    public void OnMsgTest(MsgBase msgBase)
    {
        var msg = (MsgTest)msgBase;

        BdUtils.log("--- OnMsgTest: ", msg);
    }

    public void OnMsgAction(MsgBase msgBase)
    {
        var msg = (MsgAction)msgBase;

        // env.net_commands.Enqueue(msg.a);

        BdUtils.log("--- OnMsgAction: ", msg);
    }

    public void OnMsgReset(MsgBase msgBase)
    {
        var msg = (MsgReset)msgBase;

        BdUtils.log("--- OnMsgReset: ", msg);
    }
    public void OnMsgState(MsgBase msgBase)
    {
        var msg = (MsgState)msgBase;

        BdUtils.log("--- OnMsgState: ", msg);
    }
    public void OnMsgClose(MsgBase msgBase)
    {
        var msg = (MsgClose)msgBase;
        NetManager.hasSendCloseMsg = true;
        NetManager.Close();
        BdUtils.log("--- OnMsgClose: ", msg);
    }
    public void OnMsgMove(MsgBase msgBase)
    {
        var msg = (MsgMove)msgBase;

        BdUtils.log("--- OnMsgMove: ", msg);
    }

    public void OnMsgAttack(MsgBase msgBase)
    {
        var msg = (MsgAttack)msgBase;
        BdUtils.log("~~~ OnMsgAttack: ", msg);
    }

    public static void run_method_by_msg(string msg_string, Dictionary<string, object> msg_dc = null)
    {
        if (BdUtils.is_null(msg_dc))
            msg_dc = BdUtils.conv_json_to_dict(msg_string);
        // BdUtils.log("~~~~~ ", s, BdUtils.conv_json_to_dict(s, new string[] { "protoName" }));
        var protoName = msg_dc["protoName"].ToString();
        MsgBase _m = MsgBase.Decode(protoName, msg_string);

        // Type type = Type.GetType(BdUtils.get_type(new MsgHandle()));
        // Type type = typeof(MsgHandle);
        // object msgHandle = Activator.CreateInstance(type);
        var msgHandle = new MsgHandle();
        Type type = msgHandle.GetType();

        string method_name = "On" + protoName;
        MethodInfo method = type.GetMethod(method_name);

        BdUtils.assert(method != null, $"protoName[{protoName}]没有对应的处理方案!");

        method.Invoke(msgHandle, new object[] { _m });
    }
    // public static void run_method_by_msg(string msg_string)
    // {
    //     var msg_dc = BdUtils.conv_json_to_dict(msg_string);
    //     run_method_by_msg(msg_string, msg_dc);

    // }
}


namespace MsgHandleApp
{
    public class MyClient
    {
        public static void run()
        {
            // string file_path = @"data\BaseMsg.json";
            string file_path = Path.Combine("data", "BaseMsg.json");
            BdUtils.log("absolute file_path --- ", Path.GetFullPath(file_path), "--- GetExtension:", Path.GetExtension(file_path));

            string msg_string = File.ReadAllText(file_path);

            MsgHandle.run_method_by_msg(msg_string);

            // string attr = "xx";
            // BdUtils.log("getattr --- ", BdUtils.getattr(msgHandle, attr));
            // BdUtils.setattr(msgHandle, attr, "123123");
            // BdUtils.log("setattr --- ", BdUtils.getattr(msgHandle, attr));

            // BdUtils.log("props --- ", BdUtils.Reflection.get_properties(msgHandle));
        }
    }

}

